一个小白对staticmethod与classmethod区别的理解,绝对简单易懂

您所在的位置:网站首页 python classmethod和staticmethod 一个小白对staticmethod与classmethod区别的理解,绝对简单易懂

一个小白对staticmethod与classmethod区别的理解,绝对简单易懂

2023-06-14 21:36| 来源: 网络整理| 查看: 265

作为一个初学者,最近在staticmethod与classmethod这里卡坑了,静态方法和类方法都可以通过类名加方法名或属性名来访问实例,但是他们区别何在,实际的运用场景何在?网上有很多文章说了等于白说, 于是我思考了一个小时,终于懂了,现在把所发现的分享下: @classmethod 根据Python文档的说明,classmethod(fn)表明函数fn是类的函数而非类实例的函数,在语法上,它要求fn的函数签名至少要有1个参数,函数被调用时,解释器会将类作为第1个参数传给fn(这段摘抄) @staticmethod 根据Python文档的说明,staticmethod(fn)表明函数fn是类的静态方法。具体到类定义体内某个函数的定义上,如果该函数想声明称静态成员,则只需在其定义体前加上”@staticmethod”这行, 利用装饰器语法糖来实现staticmethod(cls.fun)的目的(这段也摘抄) 那么哪些场景下staticmethod与classmethod不能互换呢? 当staticmethod与classmethod下的方法里包含了当前类的非绑定属性或方法时,并且这个类被继承了成为基类,然后基类因为某些原因被删除了,那么staticmethod与classmethod就不能互换着用了,举个例子:

class Fuck: sex = '每日一撸' #这就是非绑定的属性 @staticmethod def sta(): return Fuck.sex @classmethod def cla(cls): return cls.sex #@classmethod里面必须要传入一个参数,这个参数代表就是当前的类 class Fuck_everybody(Fuck): #因为Fuck_everybody继承了父类Fuck,所以Fuck_everybody可以调用父类的sta()方法与cla()方法 pass Fuck_everybody.sta() '每日一撸' Fuck_everybody.cla() '每日一撸' #然后我突然不爽,把Fuck删掉了 del Fuck #那么,你再试试 Fuck_everybody.sta() Traceback (most recent call last): File "", line 1, in Fuck_everybody.sta() File "", line 5, in sta return Fuck.sex NameError: name 'Fuck' is not defined Fuck_everybody.cla() #类方法还是可以照样执行的 '每日一撸'

现在知道他们的区别了吗? 再举个例子,下面的例子说明什么情况下staticmethod比classmethod更加合适,如果我想对非绑定属性做出操作,比如相像非绑定的列表添加元素的话,用staticmethod来实现的话:

class Porn: url = ['1024'] @staticmethod def sta(new_url): Porn.url.append(new_url) return Porn.url Porn.sta('91porn') ['1024', '91porn'] #用classmethod来实现的话: class Porn: url = ['1024'] @classmethod def cla(cls,new_url): cls.new_url = new_url cls.url.append(new_url) return cls.url Porn.cla('91porn') ['1024', '91porn'] #使用普通的方法(姑且那么叫吧)来实现的话: class Porn: url = ['1024'] def normal(self,new_url): self.new_url = new_url self.url.append(self.new_url) return self.url porn = Porn() porn.normal('91') ['1024', '91']

你会发现,虽然classmethod与普通方法原理上不一样,但是思路非常的相像,在这里,个人认为staticmethod更加能够让别人一眼看出你所要表达的逻辑,但是不推荐用staticmethod,像前面所举例的, 如果有一个子类继承了他,然后父类删了了,那么子类的这个方法就会报错

以上就是一个小白对staticmethod与classmethod所浅浅的认识,文章中有很多用词不规范的地方,不要受我误导了(滑稽.jpg),在不久的将来,当随着我学习的深入,对python的更加深入的理解,我会举出更好的 例子,如果这篇文章对你有帮助,那我也会很开心的



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3